home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / mpeg_play-2.1 / mpegvga.patch < prev    next >
Text File  |  1995-05-09  |  31KB  |  1,207 lines

  1. *** gray.c    Tue Feb  2 23:58:35 1993
  2. --- mpegvga/gray.c    Sun Oct 17 17:19:39 1993
  3. ***************
  4. *** 53,58 ****
  5. --- 53,59 ----
  6.     int i, max = w*h/16;
  7.   
  8.     for (i=0; i<max; i++) {
  9. + /*
  10.       out[0] = pixel[lum[0]];
  11.       out[1] = pixel[lum[1]];
  12.       out[2] = pixel[lum[2]];
  13. ***************
  14. *** 69,74 ****
  15. --- 70,81 ----
  16.       out[13] = pixel[lum[13]];
  17.       out[14] = pixel[lum[14]];
  18.       out[15] = pixel[lum[15]];
  19. +   */
  20. +   /* For VGA, pixel[i] = i */
  21. +     *(unsigned *)(&out[0]) = *(unsigned *)(&lum[0]);
  22. +     *(unsigned *)(&out[4]) = *(unsigned *)(&lum[4]);
  23. +     *(unsigned *)(&out[8]) = *(unsigned *)(&lum[8]);
  24. +     *(unsigned *)(&out[12]) = *(unsigned *)(&lum[12]);
  25.       out += 16;
  26.       lum += 16;
  27.     }
  28. *** proto.h    Wed Feb  3 16:02:59 1993
  29. --- mpegvga/proto.h    Sun Oct 17 16:57:16 1993
  30. ***************
  31. *** 49,55 ****
  32. --- 49,57 ----
  33.   
  34.   /* gdith.c */
  35.   void InitColor P((void ));
  36. + /*
  37.   int HandleXError P((Display *dpy , XErrorEvent *event ));
  38. + */
  39.   void InstallXErrorHandler P((void ));
  40.   void DeInstallXErrorHandler P((void ));
  41.   void ResizeDisplay P((int w , int h ));
  42. ***************
  43. *** 102,109 ****
  44. --- 104,113 ----
  45.   void ColorDitherImage P((unsigned char *lum , unsigned char *cr , unsigned char *cb , unsigned char *out , int rows , int cols ));
  46.   
  47.   /* util32.c */
  48. + /*
  49.   Visual *FindFullColorVisual P((Display *dpy , int *depth ));
  50.   Window CreateFullColorWindow P((Display *dpy , int x , int y , int w , int h ));
  51. + */
  52.   
  53.   /* ordered.c */
  54.   void InitOrderedDither P((void ));
  55. *** util.c    Tue Feb  2 23:58:38 1993
  56. --- mpegvga/util.c    Sun Oct 17 16:48:04 1993
  57. ***************
  58. *** 20,25 ****
  59. --- 20,26 ----
  60.    */
  61.   
  62.   #include <stdlib.h>
  63. + #include <vga.h>
  64.   #include "video.h"
  65.   #include "proto.h"
  66.   #include "util.h"
  67. ***************
  68. *** 104,109 ****
  69. --- 105,111 ----
  70.         fprintf (stderr, "\n");
  71.         perror("Unexpected read error.");
  72.       }
  73. +     vga_setmode(TEXT);
  74.       exit(1);
  75.     }
  76.     else if ((status == 0) && (bufLength < 1)) {
  77. ***************
  78. *** 119,124 ****
  79. --- 121,127 ----
  80.   
  81.       if (loopFlag) longjmp(env, 1);
  82.       DestroyVidStream(curVidStream);
  83. +     vga_setmode(TEXT);
  84.       exit(0);
  85.     }
  86.   #ifdef UTIL2
  87. *** video.c    Tue Feb  2 23:58:41 1993
  88. --- mpegvga/video.c    Sat Oct 23 14:04:06 1993
  89. ***************
  90. *** 24,30 ****
  91.   
  92.   #include <stdio.h>
  93.   #include <stdlib.h>
  94. ! #include <assert.h>
  95.   
  96.   #ifndef MIPS
  97.   #include <sys/time.h>
  98. --- 24,31 ----
  99.   
  100.   #include <stdio.h>
  101.   #include <stdlib.h>
  102. ! /* #include <assert.h> */
  103. ! #define assert(c)
  104.   
  105.   #ifndef MIPS
  106.   #include <sys/time.h>
  107. ***************
  108. *** 32,37 ****
  109. --- 33,39 ----
  110.   #include <sys/types.h>
  111.   #include <sys/system.h>
  112.   #endif
  113. + #include <vga.h>
  114.   
  115.   #include "decoders.h"
  116.   #include "video.h"
  117. ***************
  118. *** 985,990 ****
  119. --- 987,993 ----
  120.       if (data != SEQ_START_CODE) {
  121.         fprintf(stderr, "This is not an MPEG stream.");
  122.         DestroyVidStream(curVidStream);
  123. +       vga_setmode(TEXT);
  124.         exit(1);
  125.       }
  126.       first = 0;
  127. ***************
  128. *** 1024,1029 ****
  129. --- 1027,1033 ----
  130.         longjmp(env, 1);
  131.   
  132.       DestroyVidStream(curVidStream);
  133. +     vga_setmode(TEXT);
  134.       exit(0);
  135.       break;
  136.   
  137. ***************
  138. *** 1579,1584 ****
  139. --- 1583,1589 ----
  140.     while (vid_stream->ring[i]->locked != 0) {
  141.       if (++i >= RING_BUF_SIZE) {
  142.         perror("Fatal error. Ring buffer full.");
  143. +       vga_setmode(TEXT);
  144.         exit(1);
  145.       }
  146.     }
  147. *** video.h    Tue Feb  2 23:58:41 1993
  148. --- mpegvga/video.h    Sun Oct 17 16:56:44 1993
  149. ***************
  150. *** 21,28 ****
  151. --- 21,30 ----
  152.   #include <stdio.h>
  153.   #include <setjmp.h>
  154.   
  155. + /*
  156.   #include <X11/Xlib.h>
  157.   #include <X11/Xutil.h>
  158. + */
  159.   
  160.   #ifdef SH_MEM
  161.   #include <sys/ipc.h>
  162. ***************
  163. *** 244,250 ****
  164.   extern VidStream *curVidStream;
  165.   
  166.   /* Declarataion of global display pointer. */
  167. ! extern Display *display;
  168.   
  169.   /* Shared memory flag. */
  170.   extern int shmemFlag;
  171. --- 246,252 ----
  172.   extern VidStream *curVidStream;
  173.   
  174.   /* Declarataion of global display pointer. */
  175. ! /* extern Display *display; */
  176.   
  177.   /* Shared memory flag. */
  178.   extern int shmemFlag;
  179. *** README.linux    Sun Jan 15 16:44:10 1995
  180. --- mpegvga/README.linux    Sun Jan 15 16:06:09 1995
  181. ***************
  182. *** 0 ****
  183. --- 1,49 ----
  184. + This is a port of the Berkeley MPEG Video Software Decoder v2.0 to Linux.
  185. + Two binaries are provided. They require the ld.so shared library loader.
  186. + mpeg_play
  187. + A binary compiled from the stock sources, using the XFree86-2.0 libraries.
  188. + It was compiled with the flags: -O2 -fomit-frame-pointer -m486 (implicit)
  189. + using gcc 2.5.4, with some debugging code left out. Uses the X shared memory
  190. + extension that XFree86 v2.0 provides, which is a big win. The stock sources
  191. + compile cleanly and trivially.
  192. + mpeg_vga
  193. + A non-X version that uses svgalib. It is slightly faster than the X version
  194. + with shared memory and can use low resolution graphics modes. Also, with
  195. + truecolor graphics cards that svgalib supports (Cirrus, ET4000), full color
  196. + dithering can be used, which is very pretty. The graphics mode to be used can
  197. + be set with the GSVGAMODE environment variable. Requires svgalib 0.91 or
  198. + later installed.
  199. + For full color dithering (-dither color), 320x200x16M graphics mode is used
  200. + if it is available and the picture is small enough; if not, 640x480x16M is
  201. + used if available. 32K mode probed similarly.
  202. + For most other dithering methods, 320x200x256 standard VGA graphics mode is
  203. + used if the picture is small enough; 640x480x256 otherwise.
  204. + For mono dithering, 640x480x2 VGA graphics mode is used.
  205. + [NOTE: The previously uploaded version contained patches for some hacked
  206. + version of the stock sources; sorry for that.]
  207. + Patches for the stock sources are included (mpegvga.patch). It removes X
  208. + references, and uses svgalib instead. Also, the speed of gray dithering and
  209. + full-color dithering has been improved. svgalib v0.91 or later is required to
  210. + compile; it can be found on sunsite.unc.edu, directory /pub/Linux/libs.
  211. + [Speed hack have been incorporated into the main source]
  212. + mpeg_play -h (or any other invalid flag) displays dithering and other options.
  213. + Note that with gray dithering, very little time is spent converting from the
  214. + raw uncompressed data to a screen bitmap suitable for display, making it
  215. + significantly faster than the other methods.
  216. + The v2.0 source is available on sunsite.unc.edu. For sample MPEG data,
  217. + mm-ftp.cs.berkeley.edu, /pub/multimedia is one place to look.
  218. + hhanemaa@cs.ruu.nl
  219. *** gdith.c    Sun Jan 29 22:17:25 1995
  220. --- mpegvga/gdith.c    Sun Jan 29 22:44:59 1995
  221. ***************
  222. *** 28,33 ****
  223. --- 28,35 ----
  224.    */
  225.   
  226.   #include <math.h>
  227. + #include <vga.h>
  228. + #include <vgagl.h>
  229.   #include "video.h"
  230.   #include "proto.h"
  231.   #include "dither.h"
  232. ***************
  233. *** 52,65 ****
  234.   
  235.   extern int ditherType;
  236.   
  237. ! /* Structures used by the X server. */
  238. ! Display *display;
  239. ! static XImage *ximage = NULL;
  240. ! static Colormap cmap;
  241. ! static Window window;
  242. ! static GC gc;
  243.   
  244.   /* Frame Rate Info */
  245.   extern int framerate;
  246. --- 54,60 ----
  247.   
  248.   extern int ditherType;
  249.   
  250. ! int vgamode = -1;
  251.   
  252.   /* Frame Rate Info */
  253.   extern int framerate;
  254. ***************
  255. *** 155,351 ****
  256.   
  257.   }
  258.   
  259. - #ifdef SH_MEM
  260. - int gXErrorFlag = 0;
  261. - int HandleXError(dpy, event)
  262. -      Display *dpy;
  263. -      XErrorEvent *event;
  264. - {
  265. -   gXErrorFlag = 1;
  266. -   return 0;
  267. - }
  268. - void InstallXErrorHandler()
  269. - {
  270. -   int HandleXError();
  271. -   XSetErrorHandler(HandleXError);
  272. -   XFlush(display);
  273. - }
  274.   
  275. - void DeInstallXErrorHandler()
  276. - {
  277. -   XSetErrorHandler(NULL);
  278. -   XFlush(display);
  279. - }
  280. - #endif
  281.   
  282. - /*
  283. -  *--------------------------------------------------------------
  284. -  *
  285. -  * ResizeDisplay --
  286. -  *
  287. -  *    Resizes display window.
  288. -  *
  289. -  * Results:
  290. -  *    None.
  291. -  *
  292. -  * Side effects:
  293. -  *      None.
  294. -  *
  295. -  *--------------------------------------------------------------
  296. -  */
  297.   
  298.   void ResizeDisplay(w, h)
  299.        int w, h;
  300.   {
  301. !   if (ditherType == NO_DITHER || ditherType == PPM_DITHER) return;
  302. !   XResizeWindow(display, window, w, h);
  303. !   XFlush(display);
  304.   }
  305.   
  306. - /*
  307. -  *--------------------------------------------------------------
  308. -  *
  309. -  * MakeWindow --
  310. -  *
  311. -  *    Create X Window
  312. -  *
  313. -  * Results:
  314. -  *    Read the code.
  315. -  *
  316. -  * Side effects:
  317. -  *      None.
  318. -  *
  319. -  *--------------------------------------------------------------
  320. -  */
  321.   
  322. ! #ifdef SH_MEM
  323. ! int CompletionType = -1;
  324. ! #endif
  325.   
  326.   static void 
  327.   MakeWindow(name) 
  328.   char *name;
  329.   {
  330.     
  331. !   XSizeHints hint;
  332. !   unsigned int fg, bg;
  333. !   char *hello = "MPEG Play";
  334. !   int screen;
  335. !   Screen *screen_ptr;
  336. !   Window CreateFullColorWindow();
  337. !   
  338. !   if (ditherType == NO_DITHER || ditherType == PPM_DITHER) return;
  339. !   display = XOpenDisplay(name);
  340. !   if (display == NULL) {
  341. !     fprintf(stderr, "Can not open display\n");
  342. !     exit(-2);
  343. !   }
  344.   
  345. ! #ifdef SH_MEM
  346. !   if(shmemFlag)
  347. !     CompletionType = XShmGetEventBase(display) + ShmCompletion;
  348. ! #endif
  349.   
  350. !   screen = DefaultScreen (display);
  351. !   screen_ptr = XDefaultScreenOfDisplay(display);
  352. !   
  353. !   /* Fill in hint structure */
  354.   
  355. !   hint.x = 200;
  356. !   hint.y = 300;
  357. !   hint.width = 150;
  358. !   hint.height = 150;
  359. !   hint.flags = PPosition | PSize;
  360. !   
  361. !   /* Get some colors */
  362. !   
  363. !   bg = WhitePixel (display, screen);
  364. !   fg = BlackPixel (display, screen);
  365. !   
  366. !   /* Make the window */
  367.     
  368. !   if (ditherType == FULL_COLOR_DITHER || ditherType==FULL_COLOR2_DITHER) {
  369. !     window = CreateFullColorWindow (display, hint.x, hint.y, hint.width, hint.height);
  370. !     if (window == 0) {
  371. !       fprintf (stderr, "-color option only valid on full color display\n");
  372. !       exit (-1);
  373. !     }
  374.     } else if (ditherType == MONO_DITHER || ditherType == MONO_THRESHOLD) {
  375. !     window = XCreateSimpleWindow (display,
  376. !                   DefaultRootWindow (display),
  377. !                   hint.x, hint.y,
  378. !                   hint.width, hint.height,
  379. !                   4, fg, bg);
  380.     } else {
  381. !     XVisualInfo vinfo, *vinfo_ptr;
  382. !     Visual *vis;
  383. !     XSetWindowAttributes attrib;
  384. !     unsigned long attrib_flags=0;
  385. !     
  386. !     if (!XMatchVisualInfo (display, screen, 8, PseudoColor, 
  387. !                &vinfo)) {
  388. !       if (!XMatchVisualInfo(display, screen, 8, GrayScale, 
  389. !                 &vinfo)) {
  390. !         fprintf(stderr, "-requires 8 bit display\n");
  391. !         exit(-1);
  392. !       }
  393. !     }
  394. !     vis=vinfo.visual;
  395. !     if (XDefaultDepthOfScreen(screen_ptr) != 8) {
  396. !       attrib_flags |= CWColormap;
  397. !       attrib.colormap = XCreateColormap(display, DefaultRootWindow(display),
  398. !                     vis, AllocNone);
  399. !       owncmFlag = TRUE; 
  400. !     }
  401. !     attrib.background_pixel = bg;
  402. !     attrib.border_pixel = fg;
  403. !     attrib.backing_store = NotUseful;
  404. !     attrib.save_under = False;
  405. !     attrib.background_pixel = bg;
  406. !     attrib.border_pixel = bg;
  407. !     attrib_flags |= CWBackPixel | CWBorderPixel | CWBackingStore | CWSaveUnder;
  408. !     window = XCreateWindow (display,
  409. !                 DefaultRootWindow (display),
  410. !                 hint.x, hint.y,
  411. !                 hint.width, hint.height, 4,
  412. !                 8, InputOutput, vis,
  413. !                 attrib_flags, &attrib);
  414. !   }
  415. !   
  416. !   XSelectInput(display, window, StructureNotifyMask);
  417. !   /* Tell other applications about this window */
  418. !   
  419. !   XSetStandardProperties (display, window, hello, hello, None, NULL, 0, &hint);
  420. !   
  421. !   /* Map window. */
  422. !   XMapWindow(display, window);
  423. !   /* Wait for map. */
  424. !   while(1) {
  425. !     XEvent    xev;
  426. !     XNextEvent(display, &xev);
  427. !     if(xev.type == MapNotify && xev.xmap.event == window)
  428. !       break;
  429. !   }
  430. !   XSelectInput(display, window, NoEventMask);
  431.   }
  432. !   
  433.   
  434.   /*
  435.    *--------------------------------------------------------------
  436. --- 150,286 ----
  437.   
  438.   }
  439.   
  440.   
  441.   
  442.   
  443.   void ResizeDisplay(w, h)
  444.        int w, h;
  445.   {
  446. !   vga_modeinfo *modeinfo;
  447. !   /* Check if current VGA mode is big enough. */
  448. !   modeinfo = vga_getmodeinfo(vgamode);
  449. !   if (w > modeinfo->width || h > modeinfo->height) {
  450. !     int fail = 0;
  451. !     if (w > 640 || h > 480)
  452. !       fail = 1;
  453. !     else
  454. !       if (modeinfo->width == 320) {
  455. !         fail = 1;
  456. !         switch (modeinfo->bytesperpixel) {
  457. !         case 1 :
  458. !         if (vga_hasmode(G640x480x256)) {
  459. !           Palette pal;
  460. !           gl_getpalette(&pal);
  461. !           vgamode = G640x480x256;
  462. !         vga_setmode(vgamode);
  463. !         gl_setpalette(&pal);
  464. !         gl_setcontextvga(vgamode);
  465. !         if (ditherType != GRAY_DITHER)
  466. !             gl_clearscreen(255);
  467. !         gl_enableclipping();
  468. !         fail = 0;
  469. !       }
  470. !       break;
  471. !     case 2 :
  472. !         if (vga_hasmode(G640x480x32K)) {
  473. !           vgamode = G640x480x32K;
  474. !         vga_setmode(vgamode);
  475. !         gl_setcontextvga(vgamode);
  476. !         gl_enableclipping();
  477. !         fail = 0;
  478. !       }
  479. !       break;
  480. !     case 3 :
  481. !         if (vga_hasmode(G640x480x16M)) {
  482. !           vgamode = G640x480x16M;
  483. !         vga_setmode(vgamode);
  484. !         gl_setcontextvga(vgamode);
  485. !         gl_enableclipping();
  486. !         fail = 0;
  487. !       }
  488. !       break;
  489. !         }
  490. !       }
  491. !       else
  492. !         fail = 1;
  493. !     if (fail) {
  494. !         printf("MPEG screen size too big.\n");
  495. !         vga_setmode(TEXT);
  496. !         exit(-1);
  497. !     }
  498. !   }
  499.   }
  500.   
  501.   
  502. ! void
  503. ! restoretextmode() {
  504. !   vga_setmode(TEXT);
  505. ! }
  506.   
  507.   static void 
  508.   MakeWindow(name) 
  509.   char *name;
  510.   {
  511.     
  512. !   if (ditherType == NO_DITHER) return;
  513.   
  514. !   /* Make the window */
  515.   
  516. !   vga_disabledriverreport();
  517. !   vga_init();
  518.   
  519. !   #define FIRSTRES(c) G320x200x##c
  520. !   #define SECONDRES(c) G640x480x##c
  521.     
  522. !   if (ditherType == FULL_COLOR_DITHER) {
  523. !     /* Look for hicolor/truecolor mode. */
  524. !     /* 640x480 resolution makes most animations very small. */
  525. !     /* 320x200 is more full-screen, but the distortions are very visible. */
  526. !     /* Check default svgalib mode. */
  527. !     vgamode = vga_getdefaultmode();
  528. !     if (vgamode != -1) {
  529. !        if (vga_getmodeinfo(vgamode)->bytesperpixel == 3)
  530. !          /* Default mode is a truecolor mode. */
  531. !          goto gotvgamode;
  532. !        if (vga_getmodeinfo(vgamode)->colors == 32768)
  533. !          goto gotvgamode;
  534. !     }
  535. !     if (vga_hasmode(FIRSTRES(16M)))
  536. !       vgamode = FIRSTRES(16M);
  537. !     else if (vga_hasmode(SECONDRES(16M)))
  538. !       vgamode = SECONDRES(16M);
  539. !     else if (vga_hasmode(FIRSTRES(32K)))
  540. !       vgamode = FIRSTRES(32K);
  541. !     else if (vga_hasmode(SECONDRES(32K)))
  542. !       vgamode = SECONDRES(32K);
  543.     } else if (ditherType == MONO_DITHER || ditherType == MONO_THRESHOLD) {
  544. !     /* set mode suitable for mono display if available */
  545. !     if (vga_hasmode(G640x480x2))
  546. !       vgamode = G640x480x2;
  547.     } else {
  548. !     /* set 256-color mode */
  549. !     /* Check default svgalib mode. */
  550. !     vgamode = vga_getdefaultmode();
  551. !     if (vgamode != -1)
  552. !        if (vga_getmodeinfo(vgamode)->bytesperpixel == 1)
  553. !          /* Default mode is a 256 color mode. */
  554. !          goto gotvgamode;
  555. !     if (vga_hasmode(FIRSTRES(256)))
  556. !       vgamode = FIRSTRES(256);
  557. !     else if (vga_hasmode(SECONDRES(256)))
  558. !       vgamode = SECONDRES(256);
  559. !   }
  560. !   if (vgamode == -1) {
  561. !       printf("Cannot find suitable SVGA graphics mode for selected dithering.\n");
  562. !       exit(-1);
  563. !   }
  564. ! gotvgamode:
  565. !   printf("Using mode %s.\n", vga_getmodename(vgamode));
  566. !   vga_setmode(vgamode);
  567. !   gl_setcontextvga(vgamode);
  568. !   gl_enableclipping();
  569.   }
  570.   
  571.   /*
  572.    *--------------------------------------------------------------
  573. ***************
  574. *** 366,429 ****
  575.   void InitDisplay(name)
  576.   char *name;
  577.   {
  578.   
  579.     int ncolors = LUM_RANGE*CB_RANGE*CR_RANGE;
  580. -   XColor xcolor;
  581.     int i, lum_num, cr_num, cb_num;
  582. !   unsigned char r, g, b;
  583. !   Colormap dcmap;
  584.   
  585.     if (ditherType == NO_DITHER) return;
  586. -   if (noDisplayFlag) return;
  587.   
  588.     MakeWindow(name);
  589.   
  590. !   gc = XCreateGC(display, window, 0, 0);
  591. !   dcmap = cmap = XDefaultColormap(display, DefaultScreen(display));
  592. !   xcolor.flags = DoRed | DoGreen | DoBlue;
  593.   
  594. -   if (owncmFlag) goto create_map;
  595. -   retry_alloc_colors:
  596.     for (i=0; i<ncolors; i++) {
  597.   
  598.       lum_num = (i / (CR_RANGE*CB_RANGE))%LUM_RANGE;
  599.       cr_num = (i / CB_RANGE)%CR_RANGE;
  600.       cb_num = i % CB_RANGE;
  601.   
  602.       ConvertColor(lum_values[lum_num], cr_values[cr_num], cb_values[cb_num], &r, &g, &b);
  603.   
  604. !     xcolor.red = r * 256;
  605. !     xcolor.green = g * 256;
  606. !     xcolor.blue = b * 256;
  607. !     if (XAllocColor(display, cmap, &xcolor) == 0 && cmap == dcmap) {
  608. !       int j;
  609. !       unsigned long tmp_pixel;
  610. !       XWindowAttributes xwa;
  611. !       if (!quietFlag) {
  612. !         fprintf(stderr, "Using private colormap.\n");
  613. !       }
  614. !       /* Free colors. */
  615. !       for(j = 0; j < i; j ++) {
  616. !         tmp_pixel = pixel[j];
  617. !         XFreeColors(display, cmap, &tmp_pixel, 1, 0);
  618. !       }
  619. !       create_map:
  620. !       XGetWindowAttributes(display, window, &xwa);
  621. !       cmap = XCreateColormap(display, window, xwa.visual, AllocNone);
  622. !       XSetWindowColormap(display, window, cmap);
  623. !       goto retry_alloc_colors;
  624.       }
  625. !     pixel[i] = xcolor.pixel;
  626.     }
  627. -   ximage = NULL;
  628.   }
  629.   
  630.   
  631. --- 301,336 ----
  632.   void InitDisplay(name)
  633.   char *name;
  634.   {
  635. + /* For 256 color modes. */
  636.   
  637.     int ncolors = LUM_RANGE*CB_RANGE*CR_RANGE;
  638.     int i, lum_num, cr_num, cb_num;
  639. !   int r, g, b;
  640.   
  641.     if (ditherType == NO_DITHER) return;
  642.   
  643.     MakeWindow(name);
  644.   
  645. !   gl_setpalettecolor(255, 0, 0, 0);    /* black */
  646. !   gl_clearscreen(255);
  647.   
  648.     for (i=0; i<ncolors; i++) {
  649.   
  650.       lum_num = (i / (CR_RANGE*CB_RANGE))%LUM_RANGE;
  651.       cr_num = (i / CB_RANGE)%CR_RANGE;
  652.       cb_num = i % CB_RANGE;
  653.   
  654. +     r = g = b = 0;
  655.       ConvertColor(lum_values[lum_num], cr_values[cr_num], cb_values[cb_num], &r, &g, &b);
  656.   
  657. !     if (i > 256) {
  658. !       printf("mpeg_vga: not enough colors.\n");
  659. !       vga_setmode(TEXT);
  660. !       exit(-1);
  661.       }
  662. !     gl_setpalettecolor(i, r >> 2, g >> 2, b >> 2);
  663. !     pixel[i] = i;
  664.     }
  665.   }
  666.   
  667.   
  668. ***************
  669. *** 443,572 ****
  670.    *--------------------------------------------------------------
  671.    */
  672.   
  673. ! void InitGrayDisplay(name)
  674. ! char *name;
  675. ! {
  676. !   int ncolors = 128;
  677. !   XColor xcolor;
  678. !   int i;
  679. !   Colormap dcmap;
  680. !   MakeWindow(name);
  681. !   gc = XCreateGC(display, window, 0, 0);
  682. !   dcmap = cmap = XDefaultColormap(display, DefaultScreen(display));
  683. !   xcolor.flags = DoRed | DoGreen | DoBlue;
  684. !   if (owncmFlag) goto create_map;
  685. !   retry_alloc_grays:
  686. !   for (i=0; i<ncolors; i++) {
  687. !     xcolor.red = (i*2) * 256;
  688. !     xcolor.green = (i*2) * 256;
  689. !     xcolor.blue = (i*2) * 256;
  690. !     if(XAllocColor(display, cmap, &xcolor) == 0 && cmap == dcmap) {
  691. !       int j;
  692. !       unsigned long tmp_pixel;
  693. !       XWindowAttributes xwa;
  694. !       if (!quietFlag) {
  695. !         fprintf(stderr, "Using private colormap.\n");
  696. !       }
  697. !       /* Free colors. */
  698. !       for(j = 0; j < i; j ++) {
  699. !         tmp_pixel = pixel[j*2];
  700. !         XFreeColors(display, cmap, &tmp_pixel, 1, 0);
  701. !       }
  702. !       create_map:
  703. !       XGetWindowAttributes(display, window, &xwa);
  704. !       cmap = XCreateColormap(display, window, xwa.visual, AllocNone);
  705. !       XSetWindowColormap(display, window, cmap);
  706. !       goto retry_alloc_grays;
  707. !     }
  708. !     pixel[(i*2)] = xcolor.pixel;
  709. !     pixel[(i*2)+1] = xcolor.pixel;
  710. !   }
  711.   
  712. !   ximage = NULL;
  713. ! }
  714. ! /*
  715. !  *--------------------------------------------------------------
  716. !  *
  717. !  * InitGray256Display --
  718. !  *
  719. !  *    Initialized display for gray scale dither with 256 levels
  720. !  *
  721. !  * Results:
  722. !  *      None.
  723. !  *
  724. !  * Side effects:
  725. !  *      None.
  726. !  *
  727. !  *--------------------------------------------------------------
  728. !  */
  729. ! void InitGray256Display(name)
  730.   char *name;
  731.   {
  732. !   int ncolors = 256;
  733. !   XColor xcolor;
  734.     int i;
  735. -   Colormap dcmap;
  736. -   int result;
  737. -   XWindowAttributes xwa;
  738.   
  739.     MakeWindow(name);
  740.   
  741. -   gc = XCreateGC(display, window, 0, 0);
  742. -   dcmap = cmap = XDefaultColormap(display, DefaultScreen(display));
  743. -   xcolor.flags = DoRed | DoGreen | DoBlue;
  744. -   if (owncmFlag) {
  745. -     XGetWindowAttributes(display, window, &xwa);
  746. -     cmap = XCreateColormap(display, window, xwa.visual, AllocNone);
  747. -     XSetWindowColormap(display, window, cmap);
  748. -   }
  749. -   retry_alloc_grays:
  750.     for (i=0; i<ncolors; i++) {
  751. !     xcolor.red = i * 256;
  752. !     xcolor.green = i * 256;
  753. !     xcolor.blue = i * 256;
  754. !     if((result=XAllocColor(display, cmap, &xcolor)) == 0 && cmap == dcmap) {
  755. !       int j;
  756. !       unsigned long tmp_pixel;
  757. !       if (!quietFlag) {
  758. !         fprintf(stderr, "Using private colormap.\n");
  759. !       }
  760. !       /* Free colors. */
  761. !       for(j = 0; j < i; j ++) {
  762. !         tmp_pixel = pixel[j];
  763. !         XFreeColors(display, cmap, &tmp_pixel, 1, 0);
  764. !       }
  765. !       XGetWindowAttributes(display, window, &xwa);
  766. !       cmap = XCreateColormap(display, window, xwa.visual, AllocNone);
  767. !       XSetWindowColormap(display, window, cmap);
  768. !       goto retry_alloc_grays;
  769. !     }
  770. !     pixel[i] = xcolor.pixel;
  771.     }
  772. -   ximage = NULL;
  773.   }
  774.   
  775.   
  776. --- 350,374 ----
  777.    *--------------------------------------------------------------
  778.    */
  779.   
  780. ! #define NUM_COLORS 256
  781.   
  782. ! void InitGrayDisplay(name)
  783.   char *name;
  784.   {
  785. !   int ncolors = NUM_COLORS;
  786.     int i;
  787.   
  788.     MakeWindow(name);
  789.   
  790.     for (i=0; i<ncolors; i++) {
  791. !     int r, g, b;
  792. !     r = i;
  793. !     g = i;
  794. !     b = i;
  795. !     
  796. !     gl_setpalettecolor(i, r / 4, g / 4, b / 4);
  797. !     pixel[i] = i;
  798.     }
  799.   }
  800.   
  801.   
  802. ***************
  803. *** 589,608 ****
  804.   void InitMonoDisplay(name)
  805.   char *name;
  806.   {
  807. -   XGCValues xgcv;
  808.   
  809.     MakeWindow(name);
  810.   
  811. -   xgcv.background = BlackPixel(display, DefaultScreen(display));
  812. -   xgcv.foreground = WhitePixel(display, DefaultScreen(display));
  813. -   gc = XCreateGC(display, window, GCForeground | GCBackground, &xgcv);
  814. -   ximage = NULL;
  815.   }
  816.   
  817.   
  818.   /*
  819.    *--------------------------------------------------------------
  820.    *
  821. --- 391,402 ----
  822. ***************
  823. *** 625,632 ****
  824.   
  825.     MakeWindow(name);
  826.   
  827. -   gc = XCreateGC(display, window, 0, 0);
  828. -   ximage = NULL;
  829.   }
  830.   
  831.   
  832. --- 419,424 ----
  833. ***************
  834. *** 650,659 ****
  835.   ExecuteDisplay(vid_stream)
  836.        VidStream *vid_stream;
  837.   {
  838. -   char dummy;
  839. -   Visual *FindFullColorVisual();
  840. -   Visual *fc_visual;
  841. -   int depth;
  842.     static int rate_deal=-1, one_frame_time;
  843.     static struct timeval tftarget, tfnow;
  844.     int zero=0;
  845. --- 442,447 ----
  846. ***************
  847. *** 664,669 ****
  848. --- 452,459 ----
  849.       fprintf (stderr, "%d\r", totNumFrames);
  850.     }
  851.   
  852. +   if (ditherType == NO_DITHER) return;
  853.     if (partialFlag)
  854.       if (!((totNumFrames>=startFrame) && 
  855.         ((endFrame==-1) || (totNumFrames<=endFrame))))
  856. ***************
  857. *** 722,790 ****
  858.       while ((foo=getchar())!='\n');
  859.     }
  860.   
  861. -   if (ditherType == NO_DITHER) return;
  862.     if (ditherType == PPM_DITHER) {
  863.       ExecutePPM(vid_stream);
  864.       return;
  865.     }
  866.   
  867. !   if (ximage == NULL) {
  868. !     
  869. !     if (ditherType == Twox2_DITHER) {
  870. !       ximage = XCreateImage(display, None, 8, ZPixmap, 0, &dummy,
  871. !                 vid_stream->mb_width * 32,
  872. !                 vid_stream->mb_height * 32, 8, 0);
  873. !     } else if (ditherType == FULL_COLOR_DITHER) {
  874. !       fc_visual = FindFullColorVisual(display, &depth);
  875. !       ximage = XCreateImage (display, fc_visual, depth, ZPixmap,
  876. !                  0, &dummy, vid_stream->mb_width * 16,
  877. !                  vid_stream->mb_height * 16, 32, 0);
  878. !     } else if (ditherType == FULL_COLOR2_DITHER) {
  879. !       fc_visual = FindFullColorVisual(display, &depth);
  880. !       ximage = XCreateImage (display, fc_visual, depth, ZPixmap,
  881. !                  0, &dummy, vid_stream->mb_width * 32,
  882. !                  vid_stream->mb_height * 32, 32, 0);
  883. !     } else if (ditherType == MONO_DITHER || ditherType == MONO_THRESHOLD) {
  884. !       ximage = XCreateImage (display, None, 1, XYBitmap, 0, &dummy,
  885. !                  vid_stream->mb_width * 16,
  886. !                  vid_stream->mb_height * 16, 8, 0);
  887. !       ximage->byte_order = MSBFirst;
  888. !       ximage->bitmap_bit_order = MSBFirst;
  889. !     } else {
  890. !       ximage = XCreateImage(display, None, 8, ZPixmap, 0, &dummy,
  891. !                 vid_stream->mb_width * 16,
  892. !                 vid_stream->mb_height * 16, 8, 0);
  893. !     }
  894. !   }
  895. !   
  896. !   if (!noDisplayFlag) {
  897. ! #ifdef SH_MEM
  898. !     if (shmemFlag) {
  899. !       XShmPutImage(display, window, gc, vid_stream->current->ximage, 
  900. !            0, 0, 0, 0,
  901. !            vid_stream->current->ximage->width, 
  902. !            vid_stream->current->ximage->height, True);
  903. !       XFlush(display);
  904. !       
  905. !       while(1) {
  906. !     XEvent xev;
  907. !     
  908. !     XNextEvent(display, &xev);
  909. !     if(xev.type == CompletionType)
  910. !       break;
  911. !       }
  912. !     }
  913. !     else 
  914. ! #endif
  915. !       
  916.         {
  917. !     ximage->data = (char *) vid_stream->current->display; 
  918.       
  919. !     XPutImage(display, window, gc, ximage, 0, 0, 0, 0, ximage->width, ximage->height);
  920.         }
  921. -   }
  922.   }
  923.   
  924.   extern char *inputName;
  925.   extern char *strrchr();
  926. --- 512,623 ----
  927.       while ((foo=getchar())!='\n');
  928.     }
  929.   
  930.     if (ditherType == PPM_DITHER) {
  931.       ExecutePPM(vid_stream);
  932.       return;
  933.     }
  934.   
  935. !   if (!noDisplayFlag)
  936.         {
  937. !     void *data = (char *) vid_stream->current->display; 
  938.       
  939. !     if (ditherType == Twox2_DITHER) {
  940. !       /* Twice the size; 256-color mode */
  941. !       gl_putbox(0, 0, vid_stream->h_size * 2,
  942. !         vid_stream->v_size * 2, data);
  943. !     } else if (ditherType == FULL_COLOR_DITHER && BYTESPERPIXEL == 3) {
  944. !       /* Tricky conversion. */
  945. !       /* The data is padded to 32 bits per pixel, we need 24 bits. */
  946. !       int i, w;
  947. !       unsigned int *datap;
  948. !       void *box;
  949. !       unsigned char *boxp;
  950. !       datap = data;
  951. !       w = vid_stream->h_size;
  952. !       box = alloca(vid_stream->v_size * w * 3 + 3);
  953. !       boxp = box;
  954. !       for (i = 0; i < vid_stream->v_size; i++) {
  955. !         int j = 0;
  956. !         /* First byte is blue. */
  957. !         /* Nasty overlapping memory writes, but it is fast. */
  958. !         /* Note that boxp points to bytes, datap to words. */
  959. !             while (j + 7 < w) {
  960. !              *(unsigned *)boxp = *datap;
  961. !                 *(unsigned *)(boxp + 3) = *(datap + 1);
  962. !                 *(unsigned *)(boxp + 6) = *(datap + 2);
  963. !                 *(unsigned *)(boxp + 9) = *(datap + 3);
  964. !                 *(unsigned *)(boxp + 12) = *(datap + 4);
  965. !                 *(unsigned *)(boxp + 15) = *(datap + 5);
  966. !                 *(unsigned *)(boxp + 18) = *(datap + 6);
  967. !                 *(unsigned *)(boxp + 21) = *(datap + 7);
  968. !                 j += 8;
  969. !                 boxp += 24;
  970. !                 datap += 8;
  971. !             }
  972. !             while (j < w) {
  973. !               *(unsigned *)boxp = *datap;
  974. !               j++;
  975. !               boxp += 3;
  976. !               datap++;
  977. !             }
  978. !       }
  979. !       gl_putbox(0, 0, vid_stream->h_size, vid_stream->v_size, box);
  980. !     } else if (ditherType == FULL_COLOR_DITHER && BYTESPERPIXEL == 2) {
  981. !       /* The data is 8-8-8 truecolor padded to 32 bits, we need */
  982. !       /* 15-bit 5-5-5 truecolor. Pretty slow conversion. */
  983. !       int i, w;
  984. !       unsigned int *datap;
  985. !       void *box;
  986. !       unsigned char *boxp;
  987. !       datap = data;
  988. !       w = vid_stream->h_size;
  989. !       box = alloca(vid_stream->v_size * w * 2 + 3);
  990. !       boxp = box;
  991. !       for (i = 0; i < vid_stream->v_size; i++) {
  992. !         int j = 0;
  993. !         /* First byte is blue. */
  994. !         /* Note that boxp points to bytes, datap to words. */
  995. !             while (j + 1 < w) {
  996. !                 unsigned r, g, b;
  997. !             b = *((unsigned char *)datap);
  998. !             g = *((unsigned char *)datap + 1);
  999. !             r = *((unsigned char *)datap + 2);
  1000. !                 *(unsigned short *)boxp =
  1001. !                     ((r & 0xf8) << 7) + ((g & 0xf8) << 2) + (b >> 3);
  1002. !             b = *((unsigned char *)datap + 4);
  1003. !             g = *((unsigned char *)datap + 5);
  1004. !             r = *((unsigned char *)datap + 6);
  1005. !                 *(unsigned short *)(boxp + 2) =
  1006. !                     ((r & 0xf8) << 7) + ((g & 0xf8) << 2) + (b >> 3);
  1007. !                 j += 2;
  1008. !                 boxp += 4;
  1009. !                 datap += 2;
  1010. !             }
  1011. !             while (j < w) {
  1012. !                 unsigned r, g, b;
  1013. !             r = *((unsigned char *)datap);
  1014. !             g = *((unsigned char *)datap + 1);
  1015. !             g = *((unsigned char *)datap + 2);
  1016. !                 *(unsigned short *)boxp =
  1017. !                     ((r & 0xf8) << 7) + ((g & 0xf8) << 2) + (b >> 3);
  1018. !                 j++;
  1019. !                 boxp += 2;
  1020. !                 datap++;
  1021. !             }
  1022. !       }
  1023. !       gl_putbox(0, 0, vid_stream->h_size, vid_stream->v_size, box);
  1024. !         } else if (ditherType == MONO_DITHER || ditherType == MONO_THRESHOLD) {
  1025. !           /* It's MSBFirst, which is what we need. */
  1026. !           int i;
  1027. !           for (i = 0; i < vid_stream->v_size; i++)
  1028. !             vga_drawscansegment(data + i * vid_stream->h_size / 8,
  1029. !               0, i, vid_stream->h_size / 8);
  1030. !         } else {
  1031. !           /* default 256-color dithering */
  1032. !       gl_putbox(0, 0, vid_stream->h_size, vid_stream->v_size, data);
  1033. !     }
  1034.         }
  1035.   }
  1036.   
  1037.   extern char *inputName;
  1038.   extern char *strrchr();
  1039. *** main.c    Sun Jan 29 22:17:25 1995
  1040. --- mpegvga/main.c    Sun Jan 29 22:48:49 1995
  1041. ***************
  1042. *** 128,133 ****
  1043. --- 128,134 ----
  1044.     }
  1045.     if (curVidStream != NULL)
  1046.       DestroyVidStream(curVidStream);
  1047. +   restoretextmode();
  1048.     exit(1);
  1049.   }
  1050.   #else
  1051. ***************
  1052. *** 140,145 ****
  1053. --- 141,147 ----
  1054.     }
  1055.     if (curVidStream != NULL)
  1056.       DestroyVidStream(curVidStream);
  1057. +   restoretextmode();
  1058.     exit(1);
  1059.   }
  1060.   #endif
  1061. ***************
  1062. *** 307,324 ****
  1063.         exit(1);
  1064.   #endif
  1065.       }
  1066. -     else if (strcmp(argv[mark], "-shmem_off") == 0) {
  1067. -       argc--; mark++;
  1068. -       shmemFlag = 0;
  1069. -     }
  1070.       else if (strcmp(argv[mark], "-quiet") == 0) {
  1071.         argc--; mark++;
  1072.         quietFlag = 1;
  1073.       }
  1074. -     else if (strcmp(argv[mark], "-owncm") == 0) {
  1075. -       argc--; mark++;
  1076. -       owncmFlag = 1;
  1077. -     }
  1078.       else if (strcmp(argv[mark], "-step") == 0) {
  1079.         argc--; mark++;
  1080.         requireKeypressFlag = 1;
  1081. --- 309,318 ----
  1082. ***************
  1083. *** 432,442 ****
  1084.       break;
  1085.   
  1086.     case GRAY_DITHER:
  1087. -     InitGrayDisplay(name);
  1088. -     break;
  1089.     case GRAY256_DITHER:
  1090. !     InitGray256Display(name);
  1091.       break;
  1092.   
  1093.     case FULL_COLOR_DITHER:
  1094. --- 426,433 ----
  1095.       break;
  1096.   
  1097.     case GRAY_DITHER:
  1098.     case GRAY256_DITHER:
  1099. !     InitGrayDisplay(name);
  1100.       break;
  1101.   
  1102.     case FULL_COLOR_DITHER:
  1103. ***************
  1104. *** 483,500 ****
  1105.   
  1106.     }
  1107.   
  1108. - #ifdef SH_MEM
  1109. -     if (shmemFlag && (display != NULL)) {
  1110. -       if (!XShmQueryExtension(display)) {
  1111. -     shmemFlag = 0;
  1112. -     if (!quietFlag) {
  1113. -       fprintf(stderr, "Shared memory not supported\n");
  1114. -       fprintf(stderr, "Reverting to normal Xlib.\n");
  1115. -     }
  1116. -       }
  1117. -     }
  1118. - #endif
  1119.     if (setjmp(env) != 0) {
  1120.   
  1121.       DestroyVidStream(theStream);
  1122. --- 474,479 ----
  1123. ***************
  1124. *** 568,575 ****
  1125.       fprintf(stderr, "      [-framerate num]\n");
  1126.       fprintf(stderr, "      [-no_display]\n");
  1127.       fprintf(stderr, "      [-quiet]\n");
  1128. -     fprintf(stderr, "      [-owncm]\n");
  1129. -     fprintf(stderr, "      [-shmem_off]\n");
  1130.       fprintf(stderr, "      [-l_range num]\n");
  1131.       fprintf(stderr, "      [-cr_range num]\n");
  1132.       fprintf(stderr, "      [-cb_range num]\n");
  1133. --- 547,552 ----
  1134.